﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;

namespace LM.Tela.Desktop
{
    public partial class frmModelo : Form
    {
        public List<DtoModelo> modelos { get; set; }
        public frmMarca frmMarca;

        public frmModelo()
        {
            InitializeComponent();
            BindMarca();
        }

        public frmModelo(frmMarca frmMar)
        {
            frmMarca = frmMar;
        }

        private void BindMarca()
        {
            var servicoDeMarca = FabricaGenerica.Crie<IServicoDeMarca>();
            var marcas = servicoDeMarca.ConsulteTodos();
            cmbMarca.ValueMember = "Id";
            cmbMarca.DisplayMember = "Descricao";
            cmbMarca.DataSource = marcas;
            cmbMarca.SelectedIndex = -1;
        }

        private bool ValidaMarca()
        {
            if (cmbMarca.Text == null)
            {
                MessageBox.Show("É obrigatório selecionar uma marca!", "Inconsistência", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                cmbMarca.Focus();

                return false;
            }

            return true;
        }
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (ValidaMarca())
            {
                int codigo;
                int.TryParse(txtCodigo.Text, out codigo);
                var modelo = new DtoModelo { Codigo = codigo, Descricao = txtDescricao.Text, Marca = (DtoMarca)cmbMarca.SelectedItem };

                var servicoDeModelo = FabricaGenerica.Crie<IServicoDeModelo>();
                if (!EmEdicao())
                {
                    servicoDeModelo.Cadastre(modelo);
                }
                else
                {
                    servicoDeModelo.Atualize(modelo);
                }

                PrepareTelaParaNovoRegistro();
            }
        }
        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(txtCodigo.Text) && txtCodigo.Enabled == false;
        }

        private void LimpeCamposEdicao()
        {
            txtCodigo.Text = string.Empty;
            txtDescricao.Text = string.Empty;
            cmbMarca.SelectedIndex = -1;
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia("Modelo não selecionado para edição.");
            }
            else
            {
                var servicoDeModelo = FabricaGenerica.Crie<IServicoDeModelo>();
                servicoDeModelo.Exclua(int.Parse(txtCodigo.Text));

                PrepareTelaParaNovoRegistro();
            }
        }

        public void CarregueModelosJaCadastrados(List<DtoModelo> model)
        {
            var modelos = (from x in FabricaGenerica.Crie<IServicoDeModelo>().ConsulteTodos()
                               select new
                                   {
                                       Codigo = x.Codigo,
                                       Modelo = x.Descricao,
                                       Marca = x.Marca.Descricao
                                   }).ToList();

            grdModelos.DataSource = null;
            grdModelos.DataSource = modelos;
        }
        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueModelosJaCadastrados(modelos);
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
        }

        private void frmModelo_Load(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void grdModelos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                var modelo = ((dynamic)grdModelos.DataSource)[e.RowIndex];

                txtCodigo.Text = modelo.Codigo.ToString(CultureInfo.InvariantCulture);
                txtCodigo.Enabled = false;
                txtDescricao.Text = modelo.Modelo;
                cmbMarca.Text = modelo.Marca.ToString();
            }
        }
    }
}
